unit anagruoli_frm;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ExtCtrls, ComCtrls, ZDataset,datamodule_frm;

type

  { Tanagruoli }

  Tanagruoli = class(TForm)
    btelimina: TButton;
    btnuovo: TButton;
    btsalva: TButton;
    cbruoli: TComboBox;
    cbpermessi: TComboBox;
    chutenti: TCheckBox;
    edNome: TLabeledEdit;
    Label1: TLabel;
    Label2: TLabel;
    lblDepuratori: TLabel;
    TreeDepuratori: TTreeView;
    zq_ruoli: TZQuery;
    procedure bteliminaClick(Sender: TObject);
    procedure btnuovoClick(Sender: TObject);
    procedure btsalvaClick(Sender: TObject);
    procedure cbruoliChange(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure LoadComboruoli();
    procedure LoadCombopermessi();
    procedure LoadTreeCategorie();
    procedure getcategorychildparent(categoryparent, level: integer; node:TTreeNode);
    function CheckRowSelected(passTreeView:TTreeView):Boolean;

  private
    { private declarations }
  public
    { public declarations }
    idruolo_sel:integer;
  end;

    PTCategoria = ^TCategoria;

  TCategoria = record
      IDCat : string;
      NameCat : string;
      LevelCat : integer;
  end;

var
  anagruoli: Tanagruoli;

implementation

{ Tanagruoli }



procedure Tanagruoli.FormCreate(Sender: TObject);
begin
  //inizializzo le variabili

  //idruolo_sel:=0;
end;

procedure Tanagruoli.FormShow(Sender: TObject);
begin
  LoadComboruoli();
  LoadCombopermessi();
  LoadTreeCategorie();
  if idruolo_sel<>0 then
     begin
          cbruoli.ItemIndex:=cbruoli.Items.IndexOfObject(TObject(idruolo_sel));
          cbruolichange(self);
     end;
end;

procedure Tanagruoli.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  CloseAction:=cafree;
end;


procedure Tanagruoli.btsalvaClick(Sender: TObject);
begin
   //controllo che i parametri obbligatori nome e cognome siano inseriti sia
  //per la modifica che per l'inserimento
  if ednome.Text='' then
  begin
     ShowMessage('Devi indicare il nome del ruolo.');
     edNome.SetFocus;
     exit();
  end;
  if cbpermessi.ItemIndex = -1 then
  begin
     ShowMessage('Devi selezionare i permessi per il modulo manutenzioni.');
     cbpermessi.SetFocus;
     exit();
  end;
  if (CheckRowSelected(TreeDepuratori)= false) then
  begin
        ShowMessage('Devi selezionare un depuratore.');
        Exit();
  end;

  // salva tutte le modifiche fatte sui campi nella tabella
  if cbruoli.Text<>'' then
  begin
  ////////////////////////////////////////////////////////////////////
  ///              MODIFICA ruoli
  ////////////////////////////////////////////////////////////////////
      with zq_ruoli do
      begin
           Close;
           sql.Clear;
           sql.Add('UPDATE RUOLI SET '+
                    'DESCRUOLO=:DESC,'+
                    'MOD_MANUTENZIONI=:MANUTENZIONI,'+
                    'GEN_UTENTI=:UTENTI,'+
                    'Z_IDCAT=:CAT '+
                    'WHERE IDRUOLO=:ID');
           ParamByName('ID').AsInteger:=integer(cbruoli.Items.Objects[cbruoli.ItemIndex]);
           ParamByName('DESC').AsString:=edNome.Text;
           ParamByName('MANUTENZIONI').asinteger:=integer(cbpermessi.Items.Objects[cbpermessi.ItemIndex]);
           if (chutenti.Checked=true) then
              ParamByName('UTENTI').AsInteger:=1
           else
               ParamByName('UTENTI').AsInteger:=0;
           ParamByName('CAT').AsInteger:=strtoint(PTCategoria(TreeDepuratori.Selected.Data)^.IDCat);
           ExecSQL;
           //riaggiorna la lista dei soggetti nelle combo
           LoadComboruoli();
           //comunica l'esito positivo della modifica
           ShowMessage(edNome.Text+' è stato modificato correttamente.');
      end;
  end
  else
  begin
            ////////////////////////////////////////////////////////////////////
            ///              INSERIMENTO ruolo
            ////////////////////////////////////////////////////////////////////
            //inserisci il nuovo soggetto nel DB
            with zq_ruoli do
            begin
                 Close;
                 sql.Clear;
                 sql.Add('INSERT INTO RUOLI ('+
                     'DESCRUOLO,'+
                     'MOD_MANUTENZIONI,'+
                     'GEN_UTENTI,'+
                     'Z_IDCAT'+
                     ') VALUES (:DESC,:MANUTENZIONI,:UTENTI,:CAT)');
                 ParamByName('DESC').AsString:=edNome.Text;
                 ParamByName('MANUTENZIONI').asinteger:=integer(cbpermessi.Items.Objects[cbpermessi.ItemIndex]);
                 if (chutenti.Checked=true) then
                    ParamByName('UTENTI').AsInteger:=1
                 else
                    ParamByName('UTENTI').AsInteger:=0;

                 ParamByName('CAT').asinteger:=strtoint(PTCategoria(TreeDepuratori.Selected.Data)^.IDCat);
                 ExecSQL;
                 //riaggiorna la lista dei ruoli nelle combo
                 LoadComboruoli();
                 //comunica l'esito positivo dell'inserimento
                 ShowMessage(edNome.Text+' è stato inserito correttamente.');
            end;
       end;
  btnuovoClick(self);
end;

procedure Tanagruoli.btnuovoClick(Sender: TObject);
begin
  cbruoli.ClearSelection;
  cbpermessi.ClearSelection;
  edNome.Clear;
  if (CheckRowSelected(TreeDepuratori)) then TreeDepuratori.Selected.Selected:=false;
  chutenti.Checked:=false;
end;

procedure Tanagruoli.bteliminaClick(Sender: TObject);
var
  buttonSelected : Integer;
begin

   //controllo che sia stato selezionato un soggetto sennò avverto
   //che è necessario selezionarne uno
   if cbruoli.ItemIndex<>-1 then
   begin
      //chiede conferma e poi cancella il record
      buttonSelected := MessageDlg('Si sta per eliminare il ruolo '+edNome.Text+' dal database e tutte le sue relazioni con gli utenti. Continuare?',mtInformation, mbOKCancel, 0);
      if buttonSelected = mrOK     then
      begin
           with zq_ruoli do
           begin
                Close;
                sql.Clear;
                sql.Add('DELETE FROM UTENTI_RUOLI WHERE IDRUOLO=:ID');
                ParamByName('ID').AsInteger:=integer(cbruoli.Items.Objects[cbruoli.ItemIndex]);
                ExecSQL;

                Close;
                sql.Clear;
                sql.Add('DELETE FROM RUOLI WHERE IDRUOLO=:ID');
                ParamByName('ID').AsInteger:=integer(cbruoli.Items.Objects[cbruoli.ItemIndex]);
                ExecSQL;
           end;
           //rilegge tutti i soggetti e li carica nelle combo
           LoadComboruoli();
           //pulisce tutti i campi
           btnuovoClick(self);
      end
   end
   else ShowMessage('Per eliminare un ruolo è necessario prima selezionarne uno dalla lista.');
end;


procedure Tanagruoli.cbruoliChange(Sender: TObject);
var i:Integer;
begin
  if cbruoli.ItemIndex<>-1 then
    begin
         idruolo_sel:= integer(cbruoli.Items.Objects[cbruoli.ItemIndex]);
         with zq_ruoli do
         begin
              Close;
              sql.Clear;
              sql.Add('SELECT * FROM RUOLI WHERE IDRUOLO=:ID');
              ParamByName('ID').AsInteger:= idruolo_sel;
              ExecSQL;
              Open;
              edNome.Text:=FieldByName('DESCRUOLO').AsString;
              cbpermessi.ItemIndex:= FieldByName('MOD_MANUTENZIONI').AsInteger;

              if (FieldByName('GEN_UTENTI').AsInteger=1) then
                 chutenti.Checked:=true
              else
                  chutenti.Checked:=false;

              for i:=0 to TreeDepuratori.Items.Count-1 do
              begin
                if  PTCategoria(TreeDepuratori.Items.Item[i].Data)^.IDCat=FieldByName('Z_IDCAT').Asstring then
                begin
                  TreeDepuratori.Items.Item[i].Selected:=true;
                  Break;
                end;
              end;

         end;

    end;
end;


procedure Tanagruoli.LoadComboruoli();
begin
//svuota combo
cbruoli.Clear;
with zq_ruoli do
        begin
             Close;
             sql.Clear;
             sql.Add('SELECT IDRUOLO, DESCRUOLO FROM RUOLI');
             ExecSQL;
             Open;
             while not EOF do
             begin
                  cbruoli.Items.AddObject(FieldByName('DESCRUOLO').AsString,TObject(FieldByName('IDRUOLO').AsInteger));
                  Next;
             end;
        end
end;

procedure Tanagruoli.LoadCombopermessi();
begin
//svuota combo
cbpermessi.Clear;
with cbpermessi do
        begin
             Items.AddObject('0 - Nessun Accesso',TObject(0));
             Items.AddObject('1 - Sola Visualizzazione',TObject(1));
             Items.AddObject('2 - Inserimento / Modifica',TObject(2));
             Items.AddObject('3 - Eliminazione',TObject(3));
        end
end;

procedure Tanagruoli.LoadTreeCategorie();
begin
 //come nella form categorie carico la lista della categorie gerarchiche e tag
  TreeDepuratori.Items.Clear;
  getcategorychildparent(0, 1, nil);
end;

procedure Tanagruoli.getcategorychildparent(categoryparent, level: integer; node:TTreeNode);
var
  dataset1: TZQuery;
  nodo:TTreeNode;
  obj:PTCategoria;
begin
  dataset1 := TZQuery.Create(self);
  dataset1.Connection := DataModule1.ZConnection1;
  nodo:=nil;
  with dataset1 do
  begin
    sql.Clear;
    sql.add('SELECT ID_CATEGORIA_PARENT, ID_CATEGORIA_CHILD, IDCATEGORIA, NOME, GERARCHICA FROM CATEGORIE_REL, CATEGORIE');
    SQL.ADD('WHERE CATEGORIE_REL.ID_CATEGORIA_CHILD=CATEGORIE.IDCATEGORIA');
    SQL.ADD('AND ID_CATEGORIA_PARENT=:IDPARENT');
    SQL.ADD('AND IDDITTA=:IDDITTA');
    SQL.ADD('ORDER BY ID_CATEGORIA_CHILD ASC');
    ParamByName('IDPARENT').AsInteger := categoryparent;
    ParamByName('IDDITTA').AsInteger  := DataModule1.idditta;
    ExecSQL;
    Open;
    First;
    while not EOF do
    begin
      if FieldByName('gerarchica').AsBoolean then
         begin
              new(obj);
              obj^.IDCat:=  FieldByName('idcategoria').Asstring;
              obj^.NameCat := FieldByName('nome').AsString;
              obj^.LevelCat:=level;
              nodo:=TreeDepuratori.Items.AddChildObject(node,FieldByName('nome').AsString,obj);
//                      TObject(FieldByName('idcategoria').AsInteger)) ;
         end;
      getcategorychildparent(
        FieldByName('id_categoria_child').AsInteger, level + 1,nodo);
      Next;
    end;
    Close;
  end;
  FreeAndNil(dataset1);

end;

function Tanagruoli.CheckRowSelected(passTreeView:TTreeView):Boolean;
var i:Integer;
begin
     //controllo se c'è almeno una riga selezionata sennò facendo sotto la
     //select per prendere l'idcategoria da access violation il puntatore
     //perchè non è selezionato niente
     CheckRowSelected:=false;
     for i:=0 to passTreeView.Items.Count-1 do
     begin
         if passTreeView.Items.Item[i].Selected then
         begin
              CheckRowSelected:=true;
              Break;
         end;
     end;
end;

initialization
  {$I anagruoli_frm.lrs}

end.

